package com.chj.design.sk;

public class Code12_Adapter2 {
	public interface Target {
		// 将220V转换输出110V（原有插头（Adaptee）没有的）
		public void Convert_110v();
	}

	static class PowerPort220V {
		// 原有插头只能输出220V
		public void Output_220v() {
		}
	}

	static class Adapter220V implements Target {

		// 直接关联被适配类
		private PowerPort220V adaptee;

		// 可以通过构造函数传入具体需要适配的被适配类对象
		public Adapter220V(PowerPort220V adaptee) {
			this.adaptee = adaptee;
		}

		// 期待的插头要求调用Convert_110v()，但原有插头没有
		// 因此适配器补充上这个方法名
		// 但实际上Convert_110v()只是调用原有插头的Output_220v()方法的内容
		// 所以适配器只是将Output_220v()作了一层封装，封装成Target可以调用的Convert_110v()而已

		@Override
		public void Convert_110v() {
			this.adaptee.Output_220v();
		}
	}

	// 进口机器类
	static class ImportedMachine {
		private Target mAdapter220V;

		public ImportedMachine(Target mAdapter220V) {
			this.mAdapter220V = mAdapter220V;
		}

		public void work() {
			mAdapter220V.Convert_110v();
			System.out.println("进口机器正常运行");
		}
	}

	public static void main(String[] args) {

		Target mAdapter220V = new Adapter220V(new PowerPort220V());
		ImportedMachine mImportedMachine = new ImportedMachine(mAdapter220V);

		// 用户拿着进口机器插上适配器（调用Convert_110v()方法）
		// 再将适配器插上原有插头（Convert_110v()方法内部调用Output_220v()方法输出220V）
		// 适配器只是个外壳，对外提供110V，但本质还是220V进行供电
//		mAdapter220V.Convert_110v();
		mImportedMachine.work();
	}
}
